# -*- coding: utf-8 -*-
#  结合GUI界面，开发一个简易照片处理软件---
#  简易版图片处理  --软件界面自行设计

 # 要求
 #  把涉及的功能定义成函数
 # 至少实现以下功能：
#  大小调整、裁剪、旋转、叠加图片
#  增强颜色、滤镜、增强图像等功能
#  简单应用
#  结合 Thinker 界面化处理
 #  类似功能可以用下拉控制条实现
 # 功能实现为主、美观度为辅



# img = Image.open('girl.jpg')#读取图片
# img.show()#显示图片

# print(img.format,img.size,img.mode)#输出图片的格式，图片大小，图片、类型如RGB

# w,h = img.size#赋值图片大小

#定义复制图层函数
def copy():
    from PIL import Image
    img=path.get()[2:-3]
    img=Image.open(img)
    img_copy=img.copy()
    img_copy.save('img_copy.jpg')
    img_copy.show()
#定义调整大小函数
def img_resize():#img为输入的照片，w为调整的宽度，h为调整的高度
    
    from PIL import Image
    img=path.get()[2:-3]
    
    img=Image.open(img)
    temp=para.get()
    if temp=='':
        w,h = img.size
    else:
        temp=temp.split(',')
        w=int(temp[0])
        h=int(temp[1])
    img_re=img.resize((w,h))
    img_re.show()
    return img_re

# 定义自由裁剪大小函数
def cut():
    from PIL import Image
    img=path.get()[2:-3]
    img=Image.open(img)
    temp=para.get()
    if temp=='':
        a,b = img.size
        c=a
        d=b
    else:
        temp=temp.split(',')
        a=int(temp[0])
        b=int(temp[1]) 
        c=int(temp[2])
        d=int(temp[3])
    box=(a,b,c,d)
    region = img.crop(box)
    region.show()
    return region

#定义旋转函数
def ra():
    from PIL import Image
    img=path.get()[2:-3]
    img=Image.open(img)
    temp=para.get()
    if temp=='':
        p=360
    else:
        p=int(temp)
    rotate_img=img.rotate(p)
    rotate_img.show()
    return rotate_img

#定义一个镜像翻转函数
def jxfz():
    from PIL import Image
    img=path.get()[2:-3]
    img=Image.open(img)
    temp=para.get()
    if temp=='':
        n=0
    else:
        n=int(temp)
    
    if n==0:
        img_jxfz=img.transpose(Image.FLIP_LEFT_RIGHT)#左右翻转
        img_jxfz.show()
        return img_jxfz
    if n==1:
        img_jxfz=img.transpose(Image.FLIP_TOP_BOTTOM)#上下翻转
        img_jxfz.show()
        return img_jxfz
    else:
        print('参数错误，可设置为0或1,0表示左右翻转，1表示上下翻转')
        
# 叠加---添加logo、水印函数
def logo_img():
    from PIL import Image
    t=path.get()[1:-1].split(',')
    img=t[0][1:-1]
    logo=t[1][1:-1]
    img=Image.open(img)
    logo=Image.open(logo)
    #默认为原图大小叠加
    temp=para.get().split()
    if temp=='':
        w=0
        h=0
        lw=0
        lh=0
    else:
        temp=temp.split()
        w=temp[0]
        h=temp[1]
        lw=temp[2]
        lh=temp[3]
    
    if w==0 and lh==0:
        w,h=img.size
    img=img.resize((w,h))#调整原图大小
    if lw==0 and lh==0:
        lw,lh=logo.size       
    logo=logo.resize((lw,lh))#调整logo大小
    img_logo=img.paste(logo)#叠加图片
    img_logo.show()
    return img_logo


## 高级功能
# 1、增强颜色

def enhance():
    from PIL import Image
    from PIL import ImageEnhance as ie
    img=path.get()[2:-3]
    img=Image.open(img)
    enh = ie.Contrast(img)
    temp=para.get()
    if temp=='':
        double=1.0
    else:      
        double=float(temp)
    enhance_img=enh.enhance(double).show()#增强对比度
    enhance_img.show()
    return enhance_img

# 2、 平滑处理
#线性空间滤波处理
def correl2d(img,window):
    import numpy as np
    m=window.shape[0]
    n=window.shape[1]
    #边界通过0灰度值填充扩展
    img1=np.zeros((img.shape[0]+m-1,img.shape[1]+n-1))
    img1[(m-1)//2:(img.shape[0]+(m-1)//2),(n-1)//2:(img.shape[1]+(n-1)//2)]=img
    img2=np.zeros(img.shape)
    for i in range(img2.shape[0]):
        for j in range(img2.shape[1]):
            temp=img1[i:i+m,j:j+m]
            img2[i,j]=np.sum(np.multiply(temp,window))            
    return (img1,img2)
#高斯平滑滤波
#定义二维灰度图像的空间滤波函数
#定义radius*radius的高斯平滑模板
def gauss_window(radius,sigma):
    window=np.zeros((radius*2+1,radius*2+1))
    for i in range(-radius,radius+1):
        for j in range(-radius,radius+1):
            window[i+radius][j+radius]=1/(2*math.pi*sigma**2)*math.exp(-(i**2+j**2)/(2*sigma**2))#二维高斯函数
    return window/np.sum(window)
import numpy as np
from scipy import signal
import math
def gauss_correl2d(img,window):
    #使用滤波器实现图像的空间相关
    #mode='same'表示输出尺寸等于输入尺寸
    #boundary='fill'表示滤波前用常量值填充原始图像的边缘，默认常量值为0
    s=signal.correlate2d(img,window,mode='same',boundary='fill')
    return s.astype(np.uint8)

# 3、 锐化

# 4、 颜色分层

# 5、 调整gamma值  --25页

# 6、 转换成灰度图

# 7、 （rgb\hsi)分割

# 8、 滤波处理（傅里叶变换）

#GUI实现
 
from tkinter import *
from tkinter.filedialog import askopenfilenames
def selectPath():
  path_ = askopenfilenames()
  path.set(path_) 
def say():
    text='''复制只要导入图片,无需参数，
            调整功能可调节图片大小，输入形式为：400,200#即是将图片调整为400x200大小
            ;裁剪是按图片长度剪切掉，输入形式为：200,200,400,400#即是把图片从长宽200开始到400结束剪成200x200;
            ;旋转，输入形式：45#即是把图片旋转45°
            ;翻转，输入形式：0#0表示左右翻转，1表示上下翻转
            ;叠加，将两图片叠加，按第一张图片地址为主图，第二张为叠加图，参数输入形式：100,120,50,60#即是第一张图片大小为100x120,叠加图为50x60
            ;增强，将图片颜色增强，参数输入形式：1.5#即是将图片颜色增强1.5倍'''
    messagebox.showinfo(title="参数说明", message=text)
root = Tk()
root.title('简易图像处理')
root.geometry('500x500')
path = StringVar()
Label(root,text = "目标图片:").grid(row =0, column = 1)
Entry(root, textvariable = path,width=40).grid(row =0, column = 2)
Button(root, text = "图片选择", command = selectPath).grid(row = 0, column = 3)
para=StringVar()
Label(root,text = "参数说明:").grid(row =1, column = 1)
Entry(root, textvariable = para,width=40).grid(row =1, column = 2)
Button(root, text = "参数参考", command =say).grid(row = 1, column = 3)
Button(root,text='复制',width=8,command=copy).grid(row=1,column=0)
Button(root,text='调整',width=8,command=img_resize).grid(row=2,column=0)
Button(root,text='裁剪',width=8,command=cut).grid(row=3,column=0)
Button(root,text='旋转',width=8,command=ra).grid(row=4,column=0)
Button(root,text='翻转',width=8,command=jxfz).grid(row=5,column=0)
Button(root,text='叠加',width=8,command=logo_img).grid(row=6,column=0)
Button(root,text='颜色增强',width=8,command=enhance).grid(row=7,column=0)
data_show=Frame(width=400, height=450, bg='gainsboro').place(x=80,y=80,width=350,height=280)
root.mainloop()

